package com.maben.disruptor.producer;

import com.lmax.disruptor.RingBuffer;
import com.maben.disruptor.model.MessageModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * disruptor生产者业务类
 */
@Service
@Slf4j
public class DisruptorMqServiceImpl implements DisruptorMqService {

    @Autowired
    private RingBuffer<MessageModel> testMessageModelRingBuffer;


    /**
     * 发送【test】消息
     */
    @Override
    public void sendMessage2TestMq(String message) {
        //获取下一个Event槽的下标
        long sequence = testMessageModelRingBuffer.next();
        try {
            //给Event填充数据
            MessageModel event = testMessageModelRingBuffer.get(sequence);
            event.setMessage(message);
            log.info("===========send message：{}", event);
        } catch (Exception e) {
            log.error("failed to add event to testMessageModelRingBuffer for : e = {},{}",e,e.getMessage());
        } finally {
            //发布Event，激活观察者去消费，将sequence传递给改消费者
            //注意最后的publish方法必须放在finally中以确保必须得到调用；如果某个请求的sequence未被提交将会堵塞后续的发布操作或者其他的producer
            testMessageModelRingBuffer.publish(sequence);
        }
    }
}